﻿using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Drawing;
using System.Text; 
//5_1_a_s_p_x.c_o_m

public partial class png : System.Web.UI.Page
{
    private readonly string ImagePath = "Styles/Validator.jpg";
    private static string gif = "";

    protected void Page_Load(object sender, EventArgs e)
    {

        if (Session["yanzhengma"] != null)
        {
            Session["yanzhengma"] = null;
            gif = RndNum(4);
            Session["yanzhengma"] = gif;
        }
        else { 
            gif = RndNum(4);
            Session["yanzhengma"] = gif;
        }

        
        ///创建Bmp位图
        Bitmap bitMapImage = new System.Drawing.Bitmap(Server.MapPath(ImagePath));
        Graphics graphicImage = Graphics.FromImage(bitMapImage);

        ///设置画笔的输出模式
        graphicImage.SmoothingMode = SmoothingMode.HighSpeed;
        ///添加文本字符串
        graphicImage.DrawString(gif, new Font("Arial", 20, FontStyle.Bold), SystemBrushes.WindowText, new Point(0, 0));

        ///设置图像输出的格式
        Response.ContentType = "image/jpeg";

        ///保存数据流
        bitMapImage.Save(Response.OutputStream, ImageFormat.Jpeg);

        ///释放占用的资源
        graphicImage.Dispose();
        bitMapImage.Dispose();
    }

    private String GetRandomint()
    {
        Random random = new Random();
        return (random.Next(100000, 999999).ToString());
    }
            /**//* 
        此函数在汉字编码范围内随机创建含两个元素的十六进制字节数组，每个字节数组代表一个汉字，并将 
        四个字节数组存储在object数组中。 
        参数：strlength，代表需要产生的汉字个数 
        */
    public static object[] CreateRegionCode(int strlength)
    {
        //定义一个字符串数组储存汉字编码的组成元素 
        string[] rBase = new String[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

        Random rnd = new Random();

        //定义一个object数组用来 
        object[] bytes = new object[strlength];

        /**/
        /*每循环一次产生一个含两个元素的十六进制字节数组，并将其放入bject数组中 
         每个汉字有四个区位码组成 
         区位码第1位和区位码第2位作为字节数组第一个元素 
         区位码第3位和区位码第4位作为字节数组第二个元素 
        */
        for (int i = 0; i < strlength; i++)
        {
            //区位码第1位 
            int r1 = rnd.Next(11, 14);
            string str_r1 = rBase[r1].Trim();

            //区位码第2位 
            rnd = new Random(r1 * unchecked((int)DateTime.Now.Ticks) + i);//更换随机数发生器的种子避免产生重复值 
            int r2;
            if (r1 == 13)
            {
                r2 = rnd.Next(0, 7);
            }
            else
            {
                r2 = rnd.Next(0, 16);
            }
            string str_r2 = rBase[r2].Trim();

            //区位码第3位 
            rnd = new Random(r2 * unchecked((int)DateTime.Now.Ticks) + i);
            int r3 = rnd.Next(10, 16);
            string str_r3 = rBase[r3].Trim();

            //区位码第4位 
            rnd = new Random(r3 * unchecked((int)DateTime.Now.Ticks) + i);
            int r4;
            if (r3 == 10)
            {
                r4 = rnd.Next(1, 16);
            }
            else if (r3 == 15)
            {
                r4 = rnd.Next(0, 15);
            }
            else
            {
                r4 = rnd.Next(0, 16);
            }
            string str_r4 = rBase[r4].Trim();

            //定义两个字节变量存储产生的随机汉字区位码 
            byte byte1 = Convert.ToByte(str_r1 + str_r2, 16);
            byte byte2 = Convert.ToByte(str_r3 + str_r4, 16);
            //将两个字节变量存储在字节数组中 
            byte[] str_r = new byte[] { byte1, byte2 };

            //将产生的一个汉字的字节数组放入object数组中 
            bytes.SetValue(str_r, i);

        }
        return bytes;
    }

    private string stxt()
    {
        Encoding gb = Encoding.GetEncoding("gb2312");

        //调用函数产生4个随机中文汉字编码 
        object[] bytes = CreateRegionCode(3);

        //根据汉字编码的字节数组解码出中文汉字 
        string str1 = gb.GetString((byte[])Convert.ChangeType(bytes[0], typeof(byte[])));
        string str2 = gb.GetString((byte[])Convert.ChangeType(bytes[1], typeof(byte[])));
        string str3 = gb.GetString((byte[])Convert.ChangeType(bytes[2], typeof(byte[])));

        string txt = str1 + str2 + str3;
        return txt;
    }

    /// <summary>
    /// 这个是使用文字,字母,数字混合
    /// </summary>
    /// <param name="VcodeNum"></param>
    /// <returns></returns>
    public String RndNum(int VcodeNum)
    {
        String Vchar = "2,3,4,5,6,7,9,A,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,T,U,W,X,Y,Z";
        String[] VcArray = Vchar.Split(',');
        String VNum = "";
        Random random = new Random();
        for (int i = 1; i <= VcodeNum; i++)
        {
            int iNum = 0;
            while ((iNum = Convert.ToInt32(VcArray.Length * random.NextDouble())) == VcArray.Length)
            {
                iNum = Convert.ToInt32(VcArray.Length * random.NextDouble());
            }
            VNum += VcArray[iNum];
        }
        return VNum;
    }
}
